package control;

import dao.UsuarioDAO;
import entidad.Usuario;
import frontera.VentanaPrincipal;
import java.util.ArrayList;

public class ControlUsuario {

    private UsuarioDAO dao;
    private Usuario usuarioActual;

    public ControlUsuario() {
        dao = new UsuarioDAO();
    }

    public Usuario getUsuarioActual() {
        return usuarioActual;
    }

    public void setUsuarioActual(Usuario usuarioActual) {
        this.usuarioActual = usuarioActual;
    }
    
    public String validarLogin(String nombredeUsuario, String contrasena) {
        /*
         * retorna verdadero cuando existe la combinacion
         */
        if (!verificarLongitudNombredeUsuario(nombredeUsuario)) {
            return "Longitud de nombre incorrecta";
        }
        if (!verificarLongitudContrasena(contrasena)) {
            return "Longitud contrasena incorrecta";
        }
        usuarioActual = dao.existeLogin(nombredeUsuario, contrasena);
        if (usuarioActual==null) {
            return "Usuario incorrecto";
        }
        return "Bienvenido";
    }

    public String agregar(Usuario usuario) {
        /*
         * validar un nuevo usuario
         */
        if (!verificarLongitudNombre(usuario.getNombre())) {
            return "Nombre incorrecto";
        }
        if (!verificarLongitudCedula(usuario.getCedula())) {
            return "Longitud de cédula incorrecta";
        }
        if (!verificarLongitudNombredeUsuario(usuario.getNombredeUsuario())) {
            return "Longitud de nombre de usuario incorrecta";
        }
        if (!verificarLongitudContrasena(usuario.getContraseña())) {
            return "Longitud de contrasena incorrecta";
        }
        if (!verificarLongitudCargo(usuario.getCargo())) {
            return "Cargo incorrecto";
        }
        if (existe(usuario)) {
            return "Usuario existente, ingrese otros datos";
        }
//        System.out.println("entered here"+usuario.getPermisos());
//        VentanaPrincipal.controlPermiso.agregar(usuario.getPermisos());
        dao.crear(usuario);
        
        return "Usuario agregado exitosamente!";
    }

    public String modificar(Usuario usuario) {
        /*
         * modificacion de algun campo de usuario
         * Campos modificables:
         * Nombre, Nombre de usuario y contrasena
         */
        if (!verificarLongitudNombre(usuario.getNombre())) {
            return "Nombre incorrecto";
        }
        if (!verificarLongitudNombredeUsuario(usuario.getNombredeUsuario())) {
            return "Longitud de nombre de usuario incorrecta";
        }
        if (!verificarLongitudContrasena(usuario.getContraseña())) {
            return "Longitud de contrasena incorrecta";
        }
        if (!verificarLongitudCargo(usuario.getCargo())) {
            return "Cargo incorrecto";
        }
        
        
        dao.actualizar(usuario, usuario);
        
        return "Usuario modificado exitosamente!";
    }

    public boolean eliminar(Usuario usuario){
        return dao.eliminar(usuario);
    }
    
    public ArrayList<Usuario> buscar(String str) {
        ArrayList<Usuario> ret = new ArrayList<>();

        if(str.equals("")) dao.buscar("");
        
        String[] split = str.split(" ");
        for (int i=0; i<split.length; i++) {
            split[i] = split[i].trim();
            if (split[i].equals("")) continue;
            
            ArrayList<Usuario> aux = dao.buscar(split[i]);            
            for (Usuario u : aux) if (!ret.contains(u)) ret.add(u);
        }
        return ret;
    }
    
    public boolean existe(Usuario usuario){
        return (dao.leer(usuario)!=null);
    }

    public boolean verificarLongitudNombre(String nombre) {
        return (nombre.length() >= 3 && nombre.length() <= 30 && !(nombre.contains("0")
                || nombre.contains("1") || nombre.contains("2") || nombre.contains("3")
                || nombre.contains("4") || nombre.contains("5") || nombre.contains("6")
                || nombre.contains("7") || nombre.contains("8") || nombre.contains("9")));
    }

    public static boolean verificarLongitudCedula(long cedula) {
        /*
         * retorna verdadero cuando se encuentra es ese rango
         */
        return (cedula >= 1000000l && cedula <= 39999999999l);
    }

    public static boolean verificarLongitudNombredeUsuario(String nombredeUsuario) {
        /*
         * retorna verdadero cuando se encuentra en estos valores
         */
        return (nombredeUsuario.length() >= 6 && nombredeUsuario.length() <= 18 || nombredeUsuario.contains(" "));
    }

    public static boolean verificarLongitudContrasena(String contrasena) {
        /*
         * retorna verdadero cuando se encuentra en estos valores
         */
        return (contrasena.length() >= 6 && contrasena.length() <= 18);
    }

    public static boolean verificarLongitudCargo(String cargo) {
        /*
         * retorna verdadero cuando se encuentra dentro del rango
         */
        return (cargo.length() >= 5 && cargo.length() <= 20 && !(cargo.contains("0")
                || cargo.contains("1") || cargo.contains("2") || cargo.contains("3")
                || cargo.contains("4") || cargo.contains("5") || cargo.contains("6")
                || cargo.contains("7") || cargo.contains("8") || cargo.contains("9")));
    }
    
}